﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using SmartSpace.Data.Util;
using SmartSpace.Core;

namespace SmartSpace.Data
{
    public class DbScriptService : IDbScriptService
    {
        private IDataFactory _contextFactory { get; set; }

        public DbScriptService(IDataFactory contextFactory)
        {
            _contextFactory = contextFactory;
        }

        public bool ToTable(EntityMetadata metadata)
        {
            using (DataContext context = _contextFactory.Get())
            {
                string scriptSql = DbScriptUtil.GetScript(metadata);
                try
                {
                    context.Database.ExecuteSqlCommand(scriptSql);
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }

        public DataInstance GetData(EntityMetadata entityMetadata, Guid id)
        {
            return null;
        }

        public bool Store(DataInstance data)
        {
            throw new NotImplementedException();
        }

        public PagedList<DataInstance> GetListData(EntityMetadata entityMetadata, int start, int limit)
        {
            throw new NotImplementedException();
        }

        //public bool Store(DetailData data)
        //{
        //    using (SsDbContext context = _contextFactory.GetValue())
        //    {
        //        if (data.GetIdentity().GetOriginalValue() == null)
        //        {
        //            throw new Exception("标识字段不能为空!");
        //        }

        //        if (Exsit(data, context))
        //        {
        //            // 更新
        //            List<object> parameter = null;
        //            string scriptSql = DbScriptUtil.GetUpdateScript(data, out parameter);
        //            if (context.Database.ExecuteSqlCommand(scriptSql, parameter.ToArray()) > 0)
        //            {
        //                return true;
        //            }
        //        }
        //        else
        //        {
        //            // 保存
        //            List<object> parameter = null;
        //            string scriptSql = DbScriptUtil.GetInsertScript(data, out parameter);
        //            if (context.Database.ExecuteSqlCommand(scriptSql, parameter.ToArray()) > 0)
        //            {
        //                return true;
        //            }
        //        }
        //        return false;
        //    }
        //}

        //private bool Exsit(DetailData data, SsDbContext context)
        //{
        //    bool isExist = false;
        //    List<DbParameter> parameters = null;
        //    System.Data.Common.DbCommand command = context.Database.Connection.CreateCommand();
        //    string scriptSql = DbScriptUtil.GetExistScript(data, command, out parameters);
        //    context.Database.Connection.Open();
        //    command.CommandText = scriptSql;
        //    command.CommandType = System.Data.CommandType.Text;
        //    command.Parameters.AddRange(parameters.ToArray());
        //    System.Data.Common.DbDataReader reader = command.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        //    while (reader.Read())
        //    {
        //        isExist = true;
        //    }
        //    reader.Close();
        //    return isExist;
        //}


        //public ListData GetListData(ActivityMetadata activity, int start, int limit)
        //{
        //    using (SsDbContext context = _contextFactory.GetValue())
        //    {
        //        ListData list = new ListData();
        //        list.Start = start;
        //        list.Limit = limit;
        //        list.Items = new List<SimpleData>();

        //        try
        //        {
        //            context.Database.Connection.Open();

        //            System.Data.Common.DbCommand command = context.Database.Connection.CreateCommand();

        //            List<DbParameter> parameters;
        //            string scriptSql = DbScriptUtil.GetPagedListScript(activity, command, start, limit, out parameters);
        //            command.CommandText = scriptSql;
        //            command.CommandType = System.Data.CommandType.Text;
        //            command.Parameters.AddRange(parameters.ToArray());
        //            using (System.Data.Common.DbDataReader reader = command.ExecuteReader())
        //            {
        //                while (reader.Read())
        //                {
        //                    SimpleData item = new SimpleData();
        //                    item.Fields = new List<FieldInstance>();

        //                    foreach (SmartSpace.Core.Metadata.Workflow.FieldMetadata field in activity.ModuleView.Fields)
        //                    {
        //                        // 获取列表显示的字段，主键字段必须带上
        //                        if (field.IsList || field.Property.IsIdentity)
        //                        {
        //                            FieldInstance fieldData = new FieldInstance();
        //                            fieldData.SortIndex = field.SortIndex;
        //                            fieldData.Property = field.Property;
        //                            fieldData.SetValue(Convert.ToString(reader[field.Property.Name]));
        //                            item.Fields.Add(fieldData);
        //                        }
        //                    }

        //                    list.Items.Add(item);
        //                }
        //            }
                    
        //            // 获取总数
        //            List<DbParameter> totalParameters = null;
        //            System.Data.Common.DbCommand totalCommand = context.Database.Connection.CreateCommand();
        //            string totalSql = DbScriptUtil.GetTotalScript(activity, totalCommand, out totalParameters);
        //            totalCommand.CommandText = totalSql;
        //            totalCommand.CommandType = System.Data.CommandType.Text;
        //            totalCommand.Parameters.AddRange(totalParameters.ToArray());
        //            using (System.Data.Common.DbDataReader totalReader = totalCommand.ExecuteReader())
        //            {
        //                if (totalReader.Read())
        //                {
        //                   list.Total = Convert.ToInt32(totalReader["Count"]);
        //                }
        //            }
        //            //System.Data.Common.DbDataAdapter adapter = context.Database.Connection.pr
        //            //System.Data.DataTable result = command.
        //            return list;
        //        }
        //        catch
        //        {
        //            return null;
        //        }
        //        finally
        //        {
        //            context.Database.Connection.Close();
        //        }
        //    }
        //}

    }
}
